package com.tgy.JUC.Single;

/***
 * @ClassName: LazyMan01
 * @Description: 双重检测锁单例模式DCL
 * @Auther: 送你一块二向箔
 * @Date: 17:16 2022/3/15
 * @version : V1.0
 */
/**
 * 懒汉式单例模式
 */
public class LazyMan01 {
    private LazyMan01(){
        System.out.println(Thread.currentThread().getName());
    }
    // 加上volatile关键字禁止指令重排
    private volatile static LazyMan01 lazyMan01;
    /**
     * 双重检测锁模式，DCL懒汉式
     * @return
     */
    public static LazyMan01 getInstance(){
        //双重检测锁模式
        if (lazyMan01==null){
            synchronized(LazyMan01.class){
                if (lazyMan01==null){
                    lazyMan01 =  new LazyMan01();// 不是原子性操作，可能会有指令重排
                    /*
                     * 1.分配内存空间
                     * 2.执行构造器，初始化对象
                     * 3.把对象指向内存空间
                     * 多线程情况下：如果第一个线程执行了13，此时第二个线程过来可能就会判断lazyMan01不为空，直接就返回了lazyMan01
                     * 此时，lazyMan01对象内存空是空的。
                     * */
                }
            }
        }
        return lazyMan01;
    }
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                LazyMan01.getInstance();
            }).start();
        }
    }
}
